package Modelo;
import java.awt.Image;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;



public abstract class Bloque {
	
	/* El planeta en que se encuentra el bloque */
	private Planeta planeta;
	
	/* La posicion donde se encuentra el bloque 
	 * en el planeta */
	private Posicion posicionEnPlaneta;
	
	/* La prioridad que tiene el bloque sobre los demas
	 * para actuar*/	
	private Integer prioridad;
	
	/** Constructor **/
	public Bloque (Posicion posicion, Planeta planeta){
		this.setPosicion(posicion);
		this.planeta=planeta;
	}
	
	public Bloque (Element xmlElement){
		this.prioridad=Integer.parseInt(xmlElement.getAttribute("prioridad"));
		this.posicionEnPlaneta=new Posicion((Element)xmlElement.getElementsByTagName("posicion"));
	}
	
	/** Metodos **/
	private void setPosicion(Posicion posicion){
		this.posicionEnPlaneta = posicion;
	}
	
	protected Planeta getPlaneta(){
		return this.planeta;
	}
	
	public Posicion getPosicion(){
		return this.posicionEnPlaneta;
	}
	
	
	public void setPrioridad(Integer prioridad) {
		this.prioridad = prioridad;
	}
	
	public abstract Image getImagen();

	public abstract Integer getPrioridad();
	
	/* El metodo que se va a actuar sobre el pooglin de
	 * acuerdo a los distintos bloques */
	public abstract void actuar(Pooglin pooglin);
	
	/* El metodo que se va a actuar sobre el pooglin 
	 * con la habilidad puesta */
	public void actuarConHabilidad(Pooglin pooglin){
		pooglin.getHabilidad().utilizar(pooglin,this);
	}
	
	/* 
	 * Verifica si hay un pooglin sobre el bloque	  
	 */
	public boolean abajoPooglin(Pooglin pooglin){
		return (pooglin.getPosicion().getPosicionY()+1==
			this.getPosicion().getPosicionY()
			&& pooglin.getPosicion().getPosicionX()==
				this.getPosicion().getPosicionX());
	}
	
	/* 
	 * Verifica si hay un pooglin adelante del bloque	  
	 */
	public boolean adelantePooglinDerecha(Pooglin pooglin){
		return (pooglin.getPosicion().getPosicionY()==
			this.getPosicion().getPosicionY()&&
			(pooglin.getPosicion().getPosicionX()+1==
				this.getPosicion().getPosicionX()));
	}
	
	public boolean mismoLugarPooglin(Pooglin pooglin){
		return (pooglin.getPosicion().getPosicionY()==
			this.getPosicion().getPosicionY()&&
			(pooglin.getPosicion().getPosicionX()==
				this.getPosicion().getPosicionX()));
	}
		
	public boolean adelantePooglinIzquierda(Pooglin pooglin){
		return (pooglin.getPosicion().getPosicionY()==
			this.getPosicion().getPosicionY()&& 
			(pooglin.getPosicion().getPosicionX()-1==
				this.getPosicion().getPosicionX()));				
	}
	
	public boolean adelanteDiagonalArribaDerecha(Pooglin pooglin){
		return (pooglin.getPosicion().getPosicionY()-1==
			  this.getPosicion().getPosicionY())&&
			  (pooglin.getPosicion().getPosicionX()+1==
				  this.getPosicion().getPosicionX());				
	}
	
	public boolean adelanteDiagonalArribaIzquierda(Pooglin pooglin){
		return (pooglin.getPosicion().getPosicionY()-1==
			  this.getPosicion().getPosicionY())&&
			  (pooglin.getPosicion().getPosicionX()-1==
				  this.getPosicion().getPosicionX());				
	}
	
	/* El metodo que se va a romper un bloque con el
	 * rayo laser puesto sobre el pooglin */
	public abstract void romper (Pooglin pooglin);
	
	/* El metodo que se va a excavar un bloque con el 
	 * taladro ultrasonico puesto sobre el pooglin */
	public abstract void excavarUnBloque (Pooglin pooglin);
	
	/* El metodo que se va a transportar el pooglin de
	 * un bloque al otro */
	public abstract void transportarPooglin (Pooglin pooglin);
	
	/* El metodo que se va construir un tunel con el 
	 * pooglin */
	public abstract void construirTunel (Pooglin pooglin);
	
	/* El metodo que se va construir un tunel con el 
	 * pooglin */
	
	public abstract Element toXml(Document doc);

}
